//此模块存放具体的路由出来函数,供 /router/user.js 模块调用

//导入数据库操作模块
const db = require('../db/index')

//导入加密密码的包
const bcrypt = require('bcryptjs')

//导入生成token的包
const jwt = require('jsonwebtoken')

//导入config
const config = require('../config')

// 注册用户的路由处理函数
exports.regUser = (req,res)=>{
    const userinfo = req.body
    console.log('用户名',userinfo.username);
    console.log('密码',userinfo.password);

    //1.判断请求参数是否合法
    if(!userinfo.username || !userinfo.password){
        return res.send({ status:1 , message:'用户名或密码不能为空'})
    }

    //2.判断用户名是否已经存在
    const sql = 'SELECT * from ev_users WHERE username=?'
    db.query(sql,[userinfo.username],(err,results)=>{
        console.log('results',results);
        //3.执行语句失败
        if(err){
            return res.send({ status:1 , message:err.message })
        }
        //4.用户名被占用
        if(results.length > 0){
            return res.send({ status:1 , message:'用户名被占用，请更换其他用户名！' })
        }
        //5.确认用户名可用，此时调用 bcrypt.hashSync(明文密码,随机盐的长度) 方法，加密密码
        userinfo.password = bcrypt.hashSync(userinfo.password,10)
        //6.定义插入用户的sql语句
        const sql2 = 'INSERT INTO ev_users set ?'
        db.query(sql2,{ username:userinfo.username,password:userinfo.password } , (err,results)=>{
            if(err) return res.send({ status:1,message:err.message })
            //sql语句执行成功，但影响行数不为1
            if(results.affectedRows !== 1){
                return res.send({ status:1 , message: '注册用户失败，请稍后再试' })
            }
            res.send({ status:0 , message: '注册成功'})
        })
    })
}

//登录的处理函数
exports.login = (req,res)=>{
    const userinfo = req.body

    //查询当前用户名是否已经存在
    const sqlStr = "SELECT * FROM ev_users where username=?"
    db.query(sqlStr,userinfo.username,(err,results)=>{
        console.log('sql结果',results);
        //执行sql语句失败
        if(err) return res.cc(err)  

        //执行sql成功，但是查询到的数据条数不等于1
        if(results.length !== 1) return res.cc('数据异常，登录失败')

        //判断用户输入的账号密码和数据库里面的账号密码是否对应,bcrypt.compareSync()加密解密
        const compareResult = bcrypt.compareSync(userinfo.password,results[0].password)
        if(!compareResult) return res.cc('密码错误，登录失败')

        //登录成功，生成jwt的token字符串，用户信息需要剔除password和用户头像user_pic
        const user = { ...results[0] , password:'' , user_pci:'' }
        //安装生成token字符串的包 npm i jsonwebtoken@8.5.1,生成token
        const token = jwt.sign(user,config.jwtSecretKey,{
            expiresIn: '10h'   //该token有效期为10小时
        })
        //将生成的token响应给客户端
        res.send({
            status:0,
            message:'登录成功',
            token: token
        })
    })
    // res.send('login OK')
}